package cn.dwy2002.binaryhandwritingserver.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.sql.SQLException;

/**
 * @author 杜伟毅
 * @version 1.0
 * @since 2025/05/30
 */
@Import(InterceptorConfig.class)
@Configuration
@ComponentScan(basePackages = {"cn.dwy2002.binaryhandwritingserver.service.service", "cn.dwy2002.binaryhandwritingserver.mapper"})
@PropertySource("classpath:jdbc.properties")
@EnableTransactionManagement
public class AppConfig {

    /**
     * 用于解析属性占位符
     *
     * @author 杜伟毅
     * @since 2025/5/27 0027 22:20
     */

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    /**
     * 配置数据源(使用阿里云Druid)
     *
     * @param driver   数据库驱动类名
     * @param url      数据库连接URL
     * @param username 数据库用户名
     * @param password 数据库密码
     * @return Druid数据源实例
     * @author 杜伟毅
     * @since 2025/5/27 0027 22:20
     */
    @Bean
    public DataSource dataSource(
            @Value("${jdbc.driver}") String driver,
            @Value("${jdbc.url}") String url,
            @Value("${jdbc.username}") String username,
            @Value("${jdbc.password}") String password) {

        DruidDataSource datasource = new DruidDataSource();

        // 基本配置
        datasource.setDriverClassName(driver);
        datasource.setUrl(url);
        datasource.setUsername(username);
        datasource.setPassword(password);

        // 连接池配置
        datasource.setInitialSize(5);          // 初始化连接数
        datasource.setMinIdle(5);              // 最小空闲连接数
        datasource.setMaxActive(20);           // 最大连接数
        datasource.setMaxWait(60000);          // 获取连接等待超时时间(毫秒)

        // 连接有效性检查配置
        datasource.setTimeBetweenEvictionRunsMillis(60000); // 间隔多久检测一次
        datasource.setMinEvictableIdleTimeMillis(300000);   // 连接最小生存时间
        datasource.setValidationQuery("SELECT 1 FROM DUAL"); // 验证查询语句
        datasource.setTestWhileIdle(true);     // 空闲时检查连接有效性
        datasource.setTestOnBorrow(false);     // 获取连接时不检查
        datasource.setTestOnReturn(false);     // 归还连接时不检查

        // 其他配置
        datasource.setPoolPreparedStatements(true); // 开启PSCache
        datasource.setMaxPoolPreparedStatementPerConnectionSize(20); // PSCache大小

        try {
            datasource.setFilters("stat,wall"); // 配置监控统计拦截的filters
        } catch (SQLException ignored) {

        }

        return datasource;
    }

    // 配置事务管理器
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
